﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
namespace WPFServices.Services
{
    public static class Products
    {
        public static IList<PRODUCT> GetListProducts() 
        {
            try
            {
                using (var db = new VLXDKH_QLKEntities())
                {
                    var pRet = db.PRODUCTS.Where(x=>x.ACTIVE==true).Include(x => x.DETAILS_PRODUCTS).Include(x => x.DETAILS_PRODUCTS.UNIT).Include(x => x.CATALOG).ToList();
                    return pRet;
                }
            }
            catch (Exception)
            {

                throw new Exception("Không thể lấy danh sách sản phẩm");
            }
            

        }
        public static PRODUCT GetProduct(int id)
        {
            try
            {
                using (var db = new VLXDKH_QLKEntities())
                {
                    var pRet = db.PRODUCTS.Include(x => x.DETAILS_PRODUCTS).Include(x=> x.DETAILS_PRODUCTS.UNIT).Include(x=> x.CATALOG).FirstOrDefault(x => x.ID_PRO_AUTO == id);
                    return pRet;
                }
            }
            catch (Exception)
            {

                throw new Exception("Không thể lấy sản phẩm");
            }
            
        }

        public static PRODUCT GetProductByID(string sID)
        {
            try
            {
                using (var db = new VLXDKH_QLKEntities())
                {
                    var pRet = db.PRODUCTS.Include(x => x.DETAILS_PRODUCTS).Include(x => x.DETAILS_PRODUCTS.UNIT).Include(x => x.CATALOG).FirstOrDefault(x => x.ID_PRO == sID);
                    return pRet;
                }
            }
            catch (Exception)
            {

                throw new Exception("Không thể lấy sản phẩm");
            }

        }

        public static int CreateProduct(PRODUCT mProduct)
        {
            try
            {
                using (var db = new VLXDKH_QLKEntities())
                {
                    mProduct.ACTIVE = true;
                    db.PRODUCTS.Add(mProduct);
                    db.SaveChanges();
                    var idRet = mProduct.ID_PRO_AUTO;
                    return idRet;
                }
            }
            catch (Exception)
            {

                throw new Exception("Không thể tạo mới sản phẩm");
            }
           
        }

        public static void UpdateProduct(PRODUCT mProduct)
        {
            try
            {
                using (var db = new VLXDKH_QLKEntities())
                {
                    var p = db.PRODUCTS.FirstOrDefault(x => x.ID_PRO_AUTO == mProduct.ID_PRO_AUTO);
                    var dt = db.DETAILS_PRODUCTS.FirstOrDefault(x => x.ID_DETAILS == p.ID_PRO_DETAIL);
                    if (dt != null)
                    {
                        dt.ID_UNITS = mProduct.DETAILS_PRODUCTS.ID_UNITS;
                        dt.INVENTORY_COUNT = mProduct.DETAILS_PRODUCTS.INVENTORY_COUNT;
                        dt.COST_PRICES = mProduct.DETAILS_PRODUCTS.COST_PRICES;
                        dt.SELL_PRICE = mProduct.DETAILS_PRODUCTS.SELL_PRICE;
                    }
                    //height,width fix late
                    if (p != null)
                    {
                        p.ID_PRO = mProduct.ID_PRO;
                        p.ID_CATALOG = mProduct.ID_CATALOG;
                        p.NAME_PRO = mProduct.NAME_PRO;
                        p.DESCRIPTIONS = mProduct.DESCRIPTIONS;
                    }
                    db.SaveChanges();
                }
            }
            catch (Exception)
            {

                throw new Exception("Không thể cập nhật sản phẩm");
            }
        }
            
        public static void UpdateInvetoryCountByProductID(string sProductID, int iInventoryAmount)
        {
            using (var db = new VLXDKH_QLKEntities())
            {
                var productToAddAmount = db.PRODUCTS.FirstOrDefault(x => x.ID_PRO == sProductID);
                if (productToAddAmount != null) productToAddAmount.DETAILS_PRODUCTS.INVENTORY_COUNT += iInventoryAmount;
                db.SaveChanges();
            }
        }

        /// <summary>
        /// Hàm cập nhật số lượng, dài, rộng, m2 của 1 sản phẩm thông qua ProductID. ps:/ phép toán cập nhật là +=
        /// </summary>
        /// <param name="sProductID">string: Mã sản phẩm</param>
        /// <param name="iInventoryAmount">số lượng</param>
        /// <param name="fWidth">rộng</param>
        /// <param name="fHeight">dài</param>
        public static void UpdateInvetoryCountByProductID(string sProductID, int iInventoryAmount, double fWidth, double fHeight)
        {
            using (var db = new VLXDKH_QLKEntities())
            {
                var productToUpdate = db.PRODUCTS.FirstOrDefault(x => x.ID_PRO == sProductID);
                if (productToUpdate != null)
                {
                    //nếu các thuộc tính dài rộng m2 là null => không thể cập nhật
                    productToUpdate.DETAILS_PRODUCTS.INVENTORY_COUNT += iInventoryAmount;
                    productToUpdate.DETAILS_PRODUCTS.height += fHeight;
                    productToUpdate.DETAILS_PRODUCTS.width += fWidth;
                    //chu y neu la 3 so âm nhân => âm và ngược lại ==> mục đích cập nhật đúng m2
                    productToUpdate.DETAILS_PRODUCTS.M2 += fHeight*fWidth*iInventoryAmount;
                    db.SaveChanges();
                }
            }
        }

        public static void UpdateInvetoryCountByProductAutoID(int productID, int iInventoryAmount)
        {
            using (var db = new VLXDKH_QLKEntities())
            {
                var productToAddAmount = db.PRODUCTS.FirstOrDefault(x => x.ID_PRO_AUTO == productID);
                if (productToAddAmount != null) productToAddAmount.DETAILS_PRODUCTS.INVENTORY_COUNT += iInventoryAmount;
                db.SaveChanges();
            }
        }

        public static void UpdateInvetoryCountByProductAutoID(int productID, int iInventoryAmount, double fWidth, double fHeight, double fM2)
        {
            using (var db = new VLXDKH_QLKEntities())
            {
                var productToAddAmount = db.PRODUCTS.FirstOrDefault(x => x.ID_PRO_AUTO == productID);
                if (productToAddAmount != null)
                {
                    productToAddAmount.DETAILS_PRODUCTS.INVENTORY_COUNT += iInventoryAmount;
                    productToAddAmount.DETAILS_PRODUCTS.INVENTORY_COUNT += iInventoryAmount;
                    productToAddAmount.DETAILS_PRODUCTS.height += fHeight;
                    productToAddAmount.DETAILS_PRODUCTS.width += fWidth;
                    //chu y neu la 3 so âm nhân => âm và ngược lại ==> mục đích cập nhật đúng m2
                    productToAddAmount.DETAILS_PRODUCTS.M2 += fM2;
                    db.SaveChanges();
                }
            }
        }

        public static void ChangeStatus(int productId, bool active)
        {
            using (var db = new VLXDKH_QLKEntities())
            {
                var p = db.PRODUCTS.FirstOrDefault(x => x.ID_PRO_AUTO == productId);
                if (p != null) p.ACTIVE = active;
                db.SaveChanges();
            }
        }

        public static IList<PRODUCT> GetListProductsHidden()
        {
            try
            {
                using (var db = new VLXDKH_QLKEntities())
                {
                    var pRet = db.PRODUCTS.Where(x => x.ACTIVE == false).Include(x => x.DETAILS_PRODUCTS).Include(x => x.DETAILS_PRODUCTS.UNIT).Include(x => x.CATALOG).ToList();
                    return pRet;
                }
            }
            catch (Exception)
            {

                throw new Exception("Không thể lấy danh sách sản phẩm");
            }


        }

    }
}
